<!doctype html>
<html>
<head>
  <title>Test for Bug 406541</title>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="plugin-utils.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>

  <meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body>
<script type="application/x-child-payload" id="child-payload">
  // This is injected into the file:/// origin iframe, see below.

  // appletA should spawn, appletB, with a codebase outside the temp directory,
  // should not.
  var appletA = document.createElement("applet");
  var appletB = document.createElement("applet");
  var appletC = document.createElement("applet");
  appletA.type = appletB.type = appletC.type = "application/x-java-test";
  appletB.setAttribute("codebase", "file:///");
  appletC.setAttribute("codebase", "./subdir_bug406541/");
  document.body.appendChild(appletA);
  document.body.appendChild(appletB);
  document.body.appendChild(appletC);
  function isSpawned(plugin) {
    try {
      var x = plugin.getJavaCodebase();
      return true;
    } catch (e) {}
    return false;
  }
  window.parent.postMessage({ "A": isSpawned(appletA),
                              "B": isSpawned(appletB),
                              "C": isSpawned(appletC) }, "*");
</script>
<script type="application/javascript">
  SimpleTest.waitForExplicitFinish();
  setTestPluginEnabledState(SpecialPowers.Ci.nsIPluginTag.STATE_ENABLED,
                            "Java Test Plug-in");
  SpecialPowers.pushPrefEnv({ "set": [
                              ['plugin.java.mime', 'application/x-java-test']
                            ] }, runTest);

  function runTest() {
    // Create a empty file and point an iframe at it
    var Cc = SpecialPowers.Cc;
    var Ci = SpecialPowers.Ci;
    var file = Cc["@mozilla.org/file/directory_service;1"]
      .getService(Ci.nsIProperties)
      .get("TmpD", Ci.nsIFile);
    var subdir = Cc["@mozilla.org/file/directory_service;1"]
      .getService(Ci.nsIProperties)
      .get("TmpD", Ci.nsIFile);
    file.append("test_bug406541.html");
    file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0600);
    subdir.append("subdir_bug406541");
    subdir.createUnique(Ci.nsIFile.DIRECTORY_TYPE, 0600);

    var i = document.createElement("iframe");
    var loaded = false;
    i.addEventListener("load", function initialLoad() {
      if (!loaded) {
        // Once loaded, use special powers to point it at the file
        SpecialPowers.wrap(i.contentWindow).location.href = "file://" + file.path;
        loaded = true;
      } else {
        // Inject the child-payload script to the file:/// origin. Let it test
        // applet spawning and send the results in a postMessage. (Because I
        // couldn't get SpecialPowers to let me touch applets cross-origin, then
        // gave up.)
        var innerdoc = SpecialPowers.wrap(i.contentWindow).document;
        var s = innerdoc.createElement("script");
        s.type = "text/javascript";
        s.textContent = document.getElementById("child-payload").textContent;
        var finished = false;
        window.onmessage = function(message) {
          ok(message.data.A, "Plugin A should spawn");
          ok(!message.data.B, "Plugin B should NOT spawn");
          ok(message.data.C, "Plugin C should spawn");
          file.remove(false);
          subdir.remove(false);
          finished = true;
          SimpleTest.finish();
        };
        innerdoc.body.appendChild(s);

        SimpleTest.executeSoon(function() {
          if (!finished) {
            ok(finished, "Should have received callback by now");
            SimpleTest.finish();
          }
        });
      }
    }, false);
    document.body.appendChild(i);
  }
</script>
</body>
</html>
